//package org.example;
//
//import org.example.entity.CustomerInfo;
//import org.example.entity.CustomerOrder;
//import org.example.entity.CustomerRepayPlan;
//import org.example.generator.DataGenerator;
//
//import java.math.BigDecimal;
//import java.time.LocalDate;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * 测试Vintage和迁徙率逻辑
// */
//public class TestVintageMigration {
//    public static void main(String[] args) {
//        System.out.println("=== 测试Vintage和迁徙率逻辑 ===");
//
//        // 测试不同时间段的产品分布
//        testProductDistribution();
//
//        // 测试Vintage逾期率
//        testVintageOverdueRate();
//
//        // 测试迁徙率
//        testMigrationRate();
//    }
//
//    /**
//     * 测试产品分布
//     */
//    private static void testProductDistribution() {
//        System.out.println("\n=== 产品分布测试 ===");
//
//        // 测试2023年7月-12月（应该都是浩瀚小贷）
//        System.out.println("2023年7月-12月产品分布:");
//        for (int i = 0; i < 10; i++) {
//            LocalDate date = LocalDate.of(2023, 7 + (i % 6), 15);
//            String product = DataGenerator.getProductNameByDate(date);
//            System.out.println(date + ": " + product);
//        }
//
//        // 测试2024年1月后（多产品分布）
//        System.out.println("\n2024年1月后产品分布:");
//        Map<String, Long> productCount = new java.util.HashMap<>();
//        for (int i = 0; i < 100; i++) {
//            LocalDate date = LocalDate.of(2024, 1 + (i % 12), 15);
//            String product = DataGenerator.getProductNameByDate(date);
//            productCount.put(product, productCount.getOrDefault(product, 0L) + 1);
//        }
//
//        productCount.entrySet().stream()
//                .sorted((e1, e2) -> e2.getValue().compareTo(e1.getValue()))
//                .forEach(entry -> {
//                    String product = entry.getKey();
//                    long count = entry.getValue();
//                    System.out.printf("%-10s: %d次 (%.1f%%)\n", product, count, (count * 100.0 / 100));
//                });
//    }
//
//    /**
//     * 测试Vintage逾期率
//     */
//    private static void testVintageOverdueRate() {
//        System.out.println("\n=== Vintage逾期率测试 ===");
//
//        LocalDate testDate = LocalDate.of(2023, 8, 15);
//        LocalDate now = LocalDate.now();
//
//        int totalOrders = 1000;
//        int overdueOrders = 0;
//        Map<String, Integer> overdueBucketCount = new java.util.HashMap<>();
//
//        for (int i = 0; i < totalOrders; i++) {
//            CustomerInfo customer = DataGenerator.generateCustomerInfo(testDate);
//            CustomerOrder order = DataGenerator.generateCustomerOrder(customer, testDate, "测试");
//            List<CustomerRepayPlan> plans = DataGenerator.calculateRepayAmount(order, now);
//
//            // 统计逾期情况
//            boolean hasOverdue = plans.stream().anyMatch(plan ->
//                plan.getOverdueDays() > 0 || "逾期未还".equals(plan.getRepayStatus()) || "逾期已还".equals(plan.getRepayStatus()));
//
//            if (hasOverdue) {
//                overdueOrders++;
//
//                // 统计逾期区间
//                for (CustomerRepayPlan plan : plans) {
//                    if (plan.getOverdueDays() > 0) {
//                        String bucket = getOverdueBucket(plan.getOverdueDays());
//                        overdueBucketCount.put(bucket, overdueBucketCount.getOrDefault(bucket, 0) + 1);
//                    }
//                }
//            }
//        }
//
//        double overdueRate = (double) overdueOrders / totalOrders * 100;
//        System.out.printf("总订单数: %d\n", totalOrders);
//        System.out.printf("逾期订单数: %d\n", overdueOrders);
//        System.out.printf("逾期率: %.2f%%\n", overdueRate);
//
//        System.out.println("\n逾期区间分布:");
//        overdueBucketCount.entrySet().stream()
//                .sorted((e1, e2) -> e1.getKey().compareTo(e2.getKey()))
//                .forEach(entry -> {
//                    String bucket = entry.getKey();
//                    int count = entry.getValue();
//                    System.out.printf("%-4s: %d次\n", bucket, count);
//                });
//    }
//
//    /**
//     * 测试迁徙率
//     */
//    private static void testMigrationRate() {
//        System.out.println("\n=== 迁徙率测试 ===");
//
//        LocalDate testDate = LocalDate.of(2023, 8, 15);
//        LocalDate now = LocalDate.now();
//
//        Map<String, Integer> migrationCount = new java.util.HashMap<>();
//        int totalOverduePlans = 0;
//
//        for (int i = 0; i < 500; i++) {
//            CustomerInfo customer = DataGenerator.generateCustomerInfo(testDate);
//            CustomerOrder order = DataGenerator.generateCustomerOrder(customer, testDate, "测试");
//            List<CustomerRepayPlan> plans = DataGenerator.calculateRepayAmount(order, now);
//
//            for (CustomerRepayPlan plan : plans) {
//                if (plan.getOverdueDays() > 0) {
//                    totalOverduePlans++;
//                    String bucket = getOverdueBucket(plan.getOverdueDays());
//                    migrationCount.put(bucket, migrationCount.getOrDefault(bucket, 0) + 1);
//                }
//            }
//        }
//
//        System.out.printf("总逾期计划数: %d\n", totalOverduePlans);
//        System.out.println("\n逾期区间分布:");
//        migrationCount.entrySet().stream()
//                .sorted((e1, e2) -> e1.getKey().compareTo(e2.getKey()))
//                .forEach(entry -> {
//                    String bucket = entry.getKey();
//                    int count = entry.getValue();
//                    double rate = (double) count / totalOverduePlans * 100;
//                    System.out.printf("%-4s: %d次 (%.2f%%)\n", bucket, count, rate);
//                });
//
//        // 计算迁徙率
//        System.out.println("\n迁徙率分析:");
//        int m1Count = migrationCount.getOrDefault("M1", 0);
//        int m2Count = migrationCount.getOrDefault("M2", 0);
//        int m3Count = migrationCount.getOrDefault("M3", 0);
//        int m4Count = migrationCount.getOrDefault("M4", 0);
//        int m5Count = migrationCount.getOrDefault("M5", 0);
//        int m6Count = migrationCount.getOrDefault("M6", 0);
//
//        if (m1Count > 0) {
//            System.out.printf("M1->M2迁徙率: %.2f%%\n", (double) m2Count / m1Count * 100);
//        }
//        if (m2Count > 0) {
//            System.out.printf("M2->M3迁徙率: %.2f%%\n", (double) m3Count / m2Count * 100);
//        }
//        if (m3Count > 0) {
//            System.out.printf("M3->M4迁徙率: %.2f%%\n", (double) m4Count / m3Count * 100);
//        }
//        if (m4Count > 0) {
//            System.out.printf("M4->M5迁徙率: %.2f%%\n", (double) m5Count / m4Count * 100);
//        }
//        if (m5Count > 0) {
//            System.out.printf("M5->M6迁徙率: %.2f%%\n", (double) m6Count / m5Count * 100);
//        }
//    }
//
//    /**
//     * 获取逾期区间
//     */
//    private static String getOverdueBucket(int overdueDays) {
//        if (overdueDays <= 30) return "M1";
//        else if (overdueDays <= 60) return "M2";
//        else if (overdueDays <= 90) return "M3";
//        else if (overdueDays <= 120) return "M4";
//        else if (overdueDays <= 150) return "M5";
//        else return "M6";
//    }
//}

